#include "mqttclientmanager.h"
#include "common.h"
/**
 * @brief      MQTT管理器类构造函数
 * @details    无
 * @param[in]  无
 * @param[out] 无
 * @return     无
 */
MQTTClientManager::MQTTClientManager(QObject *parent) : QObject(parent)
{

}

/**
 * @brief      获取MQTT管理器单例对象首地址函数
 * @details    获取MQTT管理器单例对象首地址函数，静态成员函数，直接使用类名调用
 * @param[in]  无
 * @param[out] 无
 * @return     MQTT管理器单例对象地址
 */
MQTTClientManager *MQTTClientManager::instance()
{
    static MQTTClientManager manager;
    return &manager;
}

/**
 * @brief      连接MQTT Broker
 * @details    根据初始的MQTT host和port连接MQTT broker
 * @param[in]  无
 * @param[out] 无
 * @return     连接结果 true 连接成功 false 连接失败
 */
bool MQTTClientManager::MQTTConnect()
{
    if (mMQTTHost.isEmpty() || mMQTTPort == 0) {
        return false;
    }
    if (mMQTTClient == nullptr) {
        mMQTTClient = new QMqttClient(this);
        mMQTTClient->setHostname(mMQTTHost);
        mMQTTClient->setPort(mMQTTPort);
        mMQTTClient->setUsername(mMQTTUserNmae);
        mMQTTClient->setPassword(mMQTTPassword);
    }
    if (mMQTTClient->state() == QMqttClient::Disconnected) {
        mMQTTClient->connectToHost();
    }
    return mMQTTClient->error() == QMqttClient::NoError;
}

/**
 * @brief      客户端发布topic
 * @details    向MQTT Broker发布topic
 * @param[in]  topic   const QString & 发布的主题
 * @param[in]  message const QString & 发布的消息
 * @param[in]  qos     quint16         发布时的配置，QoS等级，缺省值：0
 *                                     00：最多分发一次（QoS 0）
 *                                     01：至少分发一次（QoS 1）
 *                                     10：仅分发一次（QoS 2）
 *                                     11：保留位（非法值，触发连接关闭）
 * @param[in]  retain  bool            发布时的配置，Broker是否保留供新订阅者获取，true 保留 false 不保留，缺省值：false
 * @param[out] 无
 * @return     发布结果 true 发布成功 false 发布失败
 */
bool MQTTClientManager::MQTTPublish(const QString &topic, const QString &message, quint16 qos, bool retain)
{
    if (mMQTTClient == nullptr || mMQTTClient->state() == QMqttClient::Disconnected) {
        LOGI("123");
        return false;
    }
    return mMQTTClient->publish(topic, message.toUtf8(), qos, retain) == 0;
}

/**
 * @brief      客户端订阅topic
 * @details    向MQTT Broker订阅topic
 * @param[in]  topic   const QString & 订阅的主题
 * @param[in]  qos     quint16         发布时的配置，QoS等级，缺省值：0
 *                                     00：最多分发一次（QoS 0）
 *                                     01：至少分发一次（QoS 1）
 *                                     10：仅分发一次（QoS 2）
 *                                     11：保留位（非法值，触发连接关闭）
 * @param[out] 无
 * @return     订阅结果 true 订阅成功 false 订阅失败
 */
bool MQTTClientManager::MQTTSubscribe(const QString &topic, quint16 qos)
{
    if (mMQTTClient == nullptr || mMQTTClient->state() == QMqttClient::Disconnected) {
        return false;
    }
    return mMQTTClient->subscribe(topic, qos) != nullptr;
}
